package com.augurit.common.workdayholiday.service;

import java.util.Date;

public interface IWorkdayHolidayService {
	/**
	 * 判断某一日期是否为假期
	 * @param day 某一日期
	 * @return 如果day是假期返回true, 否则返回false
	 */
	public boolean isHoliday(final Date day);
	
	/**
	 * 判断某一天是否为工作日（包括常规工作日或非常规工作日）
	 * @param day 某一天
	 * @return 如果day是工作日返回true, 否则返回false
	 */
	public boolean isWorkday(final Date day);
	
	/**
	 * 计算某一天经过n个工作日的工作日是哪一天
	 * @param day 起始日期
	 * @param numOfWorkDays 工作日的天数
	 * @return 从day开始经过numOfWorkDays个工作日后的日期
	 */
	public Date calWorkdayFrom(final Date day, int numOfWorkDays);
	
	/**
	 * 计算某一天的某一时刻经过多少工作小时、工作分钟后是哪一个工作日的工作小时、分钟
	 * @param day 起始日期
	 * @param hours 工作小时数
	 * @param minutes 工作分钟数
	 * @return 从day开始经过hours个工作小时minutes工作分钟后后的日期、小时、分钟
	 */
	public Date calWorkdayFrom(final Date day, int hours, int minutes);
	
	
	/**
	 * 计算给定起始日期、结束日期,求其工作日的天数(包括结束日期)
	 * @param from 起始日期
	 * @param to 结束日期
	 * @return 工作日的天数
	 */
	public int calNumOfWorkDays(final Date from, final Date to);
	
	/**
	 * 计算给定起始日期、结束日期,求其工作日的天数(包括结束日期)，精确到半天
	 * @param from 起始日期
	 * @param to 结束日期
	 * @return 工作日的天数
	 */
	public float calNumOfWorkDaysExactlyHalfOfTheDay(final Date from, final Date to);
	
	/**
	 * 计算当前年指定月的第一个工作日是那一天
	 * @param month 月份
	 * @return month指定月的第一个工作日
	 */
	public Date calFirstWorkdayInMonth(int month);
	
	/**
	 * 计算当前年指定月的最后一个工作日是那一天
	 * @param month 月份
	 * @return month指定月的最后一个工作日
	 */
	public Date calLastWorkdayInMonth(int month);
	
	/**
	 * 计算当前年指定月的工作日的天数
	 * @param month 月份
	 * @return month指定月的工作日的天数
	 */
	public int calNumOfWorkDaysInMonth(int month);
	
	/**
	 * 计算某一日期的后一天
	 * @param day 某一日期
	 * @return day的后面一天
	 */
	public Date nextDay(final Date day);
	
	/**
	 * 计算某一天的前一天
	 * @param day 某一日期
	 * @return day的前面一天
	 */
	public Date previousDay(final Date day);
	
	/**
	 * 计算从某一天开始向后的第一个工作日
	 * @param day 某一日期
	 * @return day的后面一个工作日
	 */
	public Date nextWorkday(final Date day);
	
	/**
	 * 计算从某一天开始向前的第一个工作日
	 * @param day 某一日期
	 * @return day的前面一个工作日
	 */
	public Date previousWorkday(final Date day);
	
	/**
	 * 计算开始日期经过几个工作日后的日期
	 * @param startDate 开始时间
	 * @param durationExpression 结束时间的表达式，例如是"6 business days"
	 * @return 开始日期经过几个工作日后的日期
	 */
    public Date calculateDueDate(Date startDate,String durationExpression);
    /**
	 * 计算开始日期经过几个工作日后的日期
	 * @param startDate 开始时间
	 * @param durationExpression 结束时间的表达式，例如是"6 business days"
	 * @return 开始日期经过几个工作日后的日期
	 */
	public int getWorkDays(Date startDate, Date endDate);
}

